<?php

class PerfilController extends Zend_Controller_Action {

    public function init() {
        X\Permiso::paraController();
        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    public function indexAction() {

        X\Permiso::paraAction('Listar.Perfil');
        $perfiles = $this->em->createQueryBuilder()
                        ->select('p.idPerfil')
                        ->addselect('p.nombre')
                        ->from('Default_Model_Perfil', 'p')
                        ->orderBy('p.nombre', 'asc')
                        ->setFirstResult(0)
                        ->setMaxResults(20)
                        ->getQuery()
                        ->execute();

        $cantidad = $this->em->createQueryBuilder()
                        ->select('count(p.idPerfil)')
                        ->from('Default_Model_Perfil', 'p')
                        ->getQuery()
                        ->getSingleScalarResult();


        $funcionalidades = $this->em->createQueryBuilder()
                        ->select('f.idFuncionalidad')
                        ->addselect('f.nombre')
                        ->from('Default_Model_Funcionalidad', 'f')
                        ->orderBy('f.nombre', 'asc')
                        ->getQuery()
                        ->execute();


        $perfilesAll = $this->em->createQueryBuilder()
                        ->select('p.idPerfil')
                        ->addselect('p.nombre')
                        ->from('Default_Model_Perfil', 'p')
                        ->orderBy('p.nombre', 'asc')
                        ->getQuery()
                        ->execute();

        // json
        $this->view->perfiles = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => $cantidad,
                    "rows" => $perfiles
                ));
        $this->view->funcionalidades = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => count($funcionalidades),
                    "rows" => $funcionalidades
                ));
        $this->view->perfilesAll = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => count($perfilesAll),
                    "rows" => $perfilesAll
                ));
    }

    public function ajaxCrearAction() {
        // parametro
         X\Permiso::paraAction('Crear.Perfil');
        $nombrePerfil = $this->_request->getPost('nombrePerfil');
        $ids = $this->_request->getPost('ids');

        // query
        $cantidad = $this->em->createQueryBuilder()
                        ->select('count(p.idPerfil)')
                        ->from('Default_Model_Perfil', 'p')
                        ->where("p.nombre='" . pg_escape_string($nombrePerfil) . "'")
                        ->getQuery()
                        ->getSingleScalarResult();

        // check
        if ($cantidad > 0)
            throw new Exception('Ya existe un perfil con este nombre.');

        // crear
        // instanciar
        $perfil = new Default_Model_Perfil;
        // asignar
        $perfil->setNombre($nombrePerfil);

//            $this->em->persist($perfil);
//            $this->em->flush();
        //funcionalidades
        $cs = Zend_Json::decode($ids);

        // agregar
        foreach ($cs as $id) {
            $funcionalidad = $this->em->find('Default_Model_Funcionalidad', $id);

            $funcionalidad->addPerfil($perfil);

            $perfil->addFuncionalidad($funcionalidad);
        }
        // guardar

        $this->em->persist($perfil);
        $this->em->flush();

        // json
        X\Msg::Success('El perfil se ha creado con éxito.');
    }

    public function ajaxListarAction() {
        // parametro
        X\Permiso::paraAction('Listar.Perfil');
        $start = $this->_request->getPost("start");
        $limit = $this->_request->getPost("limit");
        $sort = $this->_request->getPost("sort");
        $dir = $this->_request->getPost("dir");

        // paginacion
        $start = isset($start) ? $start : 0;
        $limit = isset($limit) ? $limit : 20;
        $sort = isset($sort) ? $sort : 'nombre';
        $dir = isset($dir) ? $dir : 'asc';
        $pref = 'p.';

        // query
        $perfiles = $this->em->createQueryBuilder()
                        ->select('p.idPerfil')
                        ->addselect('p.nombre')
                        ->from('Default_Model_Perfil', 'p')
                        ->orderBy(pg_escape_string($pref . $sort), pg_escape_string($dir))
                        ->setFirstResult(pg_escape_string($start))
                        ->setMaxResults(pg_escape_string($limit))
                        ->getQuery()
                        ->execute();

        $cantidad = $this->em->createQueryBuilder()
                        ->select('count(p.idPerfil)')
                        ->from('Default_Model_Perfil', 'p')
                        ->getQuery()
                        ->getSingleScalarResult();

        // json
        echo Zend_Json::encode(Array(
            "success" => true,
            "total" => $cantidad,
            "rows" => $perfiles
        ));
    }

    public function ajaxEditarAction() {
        // parametro
        X\Permiso::paraAction('Editar.Perfil');
        $codigoPerfil = $this->_request->getPost('codigoPerfil');
        $nombrePerfil = $this->_request->getPost('nombrePerfil');
        $ids = $this->_request->getPost('ids');

        // query
        $cantidad = $this->em->createQueryBuilder()
                        ->select('count(p.idPerfil)')
                        ->from('Default_Model_Perfil', 'p')
                        ->where("p.nombre='" . pg_escape_string($nombrePerfil) . "'")
                        ->andWhere("p.idPerfil<>'" . pg_escape_string($codigoPerfil) . "'")
                        ->getQuery()
                        ->getSingleScalarResult();

        // check
        if ($cantidad > 0)
            throw new Exception('Ya existe un perfil con este nombre.');

        // editar
        // obtener

        $perfil = $this->em->find('Default_Model_Perfil', $codigoPerfil);

        // asignar
        $perfil->setNombre($nombrePerfil);
        //funcionalidades
        $cs = Zend_Json::decode($ids);
        // limpiar
        foreach ($perfil->getFuncionalidades() as $funcionalidad) {
            $funcionalidad->getPerfiles()->removeElement($perfil);
            $perfil->getFuncionalidades()->removeElement($funcionalidad);
        }
        // agregar
        foreach ($cs as $id) {
            $funcionalidad = $this->em->find('Default_Model_Funcionalidad', $id);
            $funcionalidad->addPerfil($perfil);
            $perfil->addFuncionalidad($funcionalidad);
        }
        // guardar
        $this->em->persist($perfil);
        $this->em->flush();

        // json
        X\Msg::Success('El perfil se ha guardado con éxito.');
    }

    public function ajaxImportarAction() {
        // action body
    }

    public function ajaxEliminarAction() {
        // parametro
        X\Permiso::paraAction('Eliminar.Perfil');
        $codigoPerfil = $this->_request->getPost('idPerfil');


        $configs = $this->em->createQueryBuilder()
                        ->select('p.idPerfil')
                        ->join('f.perfil', 'p')
                        ->from('Default_Model_PerfilDepartamento', 'f')
                        ->where("f.perfil='$codigoPerfil'")
                        ->getQuery()
                        ->execute();
        if (count($configs) > 0) {
            X\Msg::Success('Este perfil es esta en uso y no se puede eliminar');
            return;
        }

        // eliminar
        // obtener
        $perfil = $this->em->find('Default_Model_Perfil', $codigoPerfil);
        // remover
        $this->em->remove($perfil);
        // guardar
        $this->em->flush();

        // json
        X\Msg::Success('');
    }

    public function ajaxFuncionalidadesAction() {

        $codigoPerfil = $this->_request->getPost("idPerfil");

        // query
        $habilitadas = $this->em->createQueryBuilder()
                        ->select('f.idFuncionalidad')
                        ->from('Default_Model_Funcionalidad', 'f')
                        ->join('f.perfiles', 'p')
                        ->where("p.idPerfil=" . pg_escape_string($codigoPerfil))
                        ->orderBy('f.nombre', 'asc')
                        ->getQuery()
                        ->execute();

        // json

        echo Zend_Json::encode(Array(
            "success" => true,
            "total" => count($habilitadas),
            "rows" => $habilitadas
        ));
    }

}

